package com.study.zkyxgs1.utils;

import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * 数据库操作工具接口
 * @author weixiaochun
 * @date 2022/6/16 20:34
 */
public interface DBUtils<T> {

    /**
     * 保存单条数据
     * @param data 保存的数据
     */
    public void save(T data);

    /**
     * 批量保存
     * @param entityList 保存的数据集合
     */
    public void saveBatch(Collection<T> entityList);

    /**
     * 根据id删除数据
     * @param id id
     * @param clazz 指定的class
     */
    public boolean removeById(Object id, Class<T> clazz);

    /**
     * 根据map条件删除数据
     * @param map map条件
     * @param clazz 指定class
     */
    public void removeByMap(Map<String, Object> map, Class<T> clazz);

    /**
     * 根据id更新数据
     * @param data 更新数据
     * @return
     */
    public boolean updateById(T data);

    /**
     * 批量根据id更新数据
     * @param list 更新数据集合
     */
    public void updateBatchById(Collection<T> list);

    /**
     * 根据id查询数据
     * @param id id
     * @param clazz 指定的class
     * @return
     */
    public T getById(Object id, Class<T> clazz);

    /**
     * 查询所有
     * @param clazz 指定class
     * @return
     */
    public List<T> getAll(Class<T> clazz);

    /**
     * 根据单个条件查询数据
     * @param key 数据的key
     * @param val 数据的val
     * @param clazz 指定的class
     * @return
     */
    public List<T> getByOneQuery(String key, Object val, Class<T> clazz);

    /**
     * 根据实体的数据进行查询
     * @param data 实体类
     * @param clazz 指定的class
     * @return
     */
    public List<T> getByEntity(T data, Class<T> clazz);

    /**
     * 根据范围查询数据
     * @param key 条件的key
     * @param start 开始的值
     * @param end 结束的值
     * @param clazz 指定的class
     * @return
     */
    public List<T> getByRange(String key, Object start, Object end, Class<T> clazz);

    /**
     * 根据集合查询数据
     * @param key 条件的key
     * @param list 条件的值集合
     * @param clazz 指定的class
     * @return
     */
    public List<T> getByList(String key, Collection list, Class<T> clazz);

    /**
     * 根据嵌套参数查询数据
     * @param clazz 指定的class
     * @param val 条件的val
     * @param keys 嵌套条件的keys
     * @return
     */
    public List<T> getByNest(List<String> keys, Object val, Class<T> clazz);

    /**
     * 根据嵌套参数查询数据
     * @param map 条件val
     * @param clazz 指定的class
     * @return
     */
    public List<T> getByNest(Map<String, Object> map, Class<T> clazz);
}
